package org.darkforest.common.util;

import com.alibaba.fastjson.JSON;
import org.apache.commons.lang3.StringUtils;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;

/**
 * Created by Justin on 15/2/1.
 */
public class DateUtil {

    private DateUtil() {

    }

    public static final String DEFAULT_GBK_TIME_PATTERN = "yyyy年MM月dd日 HH时mm分ss秒";
    public static final String DEFAULT_TIME_PATTERN = "yyyy-MM-dd HH:mm:ss";
    public static final String DEFAULT_DATE_PATTERN = "yyyy-MM-dd";
    public static final String COMPACT_TIME_PATTERN = "yyMMddHHmmssSSS";
    public static final String ZIP_TIME_PATTERN = "yyyyMMddHHmmssSSS";
    public static final String YEAR_MONTH_PATTERN = "yyyy-MM";

    /**
     *
     * @param year
     * @param month
     * @return 某年某月的最后一天
     */
    public static int getLastDayOfMonth(int year, int month) {
        Calendar cal = Calendar.getInstance();
        cal.set(Calendar.YEAR, year);
        cal.set(Calendar.MONTH, month);
        // 某年某月的最后一天
        return cal.getActualMaximum(Calendar.DATE);
    }


    /**
     *
     * @param year
     * @param month
     * @return 某年某月的最后一天
     */
    public static int getFirstDayOfMonth(int year, int month) {
        Calendar cal = Calendar.getInstance();
        cal.set(Calendar.YEAR, year);
        cal.set(Calendar.MONTH, month);
        return cal.getActualMinimum(Calendar.DATE);
    }

    public static String toIntDateString(Integer time){
    	if(time == 0) return null;
    	Calendar c = Calendar.getInstance();
    	c.setTimeInMillis((long)time * 1000);
    	return dateToString(c.getTime(), DEFAULT_TIME_PATTERN);
    }

    public static String toGbkStrDate(Integer time){
        if(time == 0) return null;
        Calendar c = Calendar.getInstance();
        c.setTimeInMillis((long)time * 1000);
        return dateToString(c.getTime(), DEFAULT_GBK_TIME_PATTERN);
    }

    public static Date toIntDate(Integer time){
        if(time == 0) return null;
        Calendar c = Calendar.getInstance();
        c.setTimeInMillis((long)time * 1000);
        return c.getTime();
    }

    public static String toIntDateString(Integer time,String format){
        if(time == 0) return null;
        Calendar c = Calendar.getInstance();
        c.setTimeInMillis((long)time * 1000);
        return dateToString(c.getTime(), format);
    }


    public static Date strToDate(String date, String pattern){
    	try {
    		SimpleDateFormat sdf = new SimpleDateFormat(pattern);
    		return sdf.parse(date);
		} catch (Exception e) {
			return null;
		}
    }


    public static String toDateString(Date date) {
        return dateToString(date, DEFAULT_DATE_PATTERN);
    }

    public static String toTimeString(Date date) {
        return dateToString(date, DEFAULT_TIME_PATTERN);
    }

    public static String dateToString(Date date, String pattern) {
        if (date == null || StringUtils.isBlank(pattern)) {
            return StringUtils.EMPTY;
        }
        return new SimpleDateFormat(pattern).format(date);
    }

    /**
     * 获取当前时间的unixt时间戳，对应mysql的UNIX_TIMESTAMP()函数
     *
     * @return
     */
    public static String unixTimeStamp() {
        Long time = new Date().getTime() / 1000;
        return time.toString();
    }


    public static Long unixTimeStampInt() {
    	return Long.parseLong(unixTimeStamp());
    }

    public static int toUnixTimeStamp(String dateStr) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date date = null;
        try {
            date = sdf.parse(dateStr);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        Long time = date.getTime()/1000;
        return time.intValue();
    }


    public static int toUnixTimeStampByDate(String dateStr) {
        SimpleDateFormat sdf = new SimpleDateFormat(DEFAULT_DATE_PATTERN);
        Date date = null;
        try {
            date = sdf.parse(dateStr);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        Long time = date.getTime()/1000;
        return time.intValue();
    }

    public static int toUnixTimeStamp(String s, String defaultDatePattern) {
        SimpleDateFormat sdf = new SimpleDateFormat(defaultDatePattern);
        Date date = null;
        try {
            date = sdf.parse(s);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        Long time = date.getTime()/1000;
        return time.intValue();
    }

    /**
     * 获取现在时间附近的时间，step单位为分钟,负数时计算过去时间
     * @param step
     * @return
     */
    public static Long getTimeNearByNow(int step){
        Long now = unixTimeStampInt();
        return now + step*60;
    }

    /**
     * 根据参数（秒单位）获取距今的时间yyyy-MM-dd HH:mm:ss格式
     * @param seconds
     * @return
     */
    public static String getTimeNearByNow(long seconds){
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        GregorianCalendar gc = new GregorianCalendar();
        gc.setTimeInMillis(new Date().getTime() + seconds *1000);
        return formatter.format(gc.getTime());
    }


    public static String converMsec2Date(long msec){
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Calendar calendar = Calendar.getInstance();
        calendar.setTimeInMillis(msec *1000);


        return formatter.format(calendar.getTime());
    }

//    public static void main(String[] args){
//        System.out.println(getTimeNearByNow(-5));
//    }

    /**
     * 当月最后一天
     * @return
     */
    private static String getLastDay() {
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
        Calendar calendar = Calendar.getInstance();
        Date theDate = calendar.getTime();
        String s = df.format(theDate);
        StringBuffer str = new StringBuffer().append(s).append(" 23:59:59");
        return str.toString();

    }

    private static void convertWeekByDate(Date time) {
        SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd"); //设置时间格式
        Calendar cal = Calendar.getInstance();
        cal.setTime(time);
        //判断要计算的日期是否是周日，如果是则减一天计算周六的，否则会出问题，计算到下一周去了
        int dayWeek = cal.get(Calendar.DAY_OF_WEEK);//获得当前日期是一个星期的第几天
        if(1 == dayWeek) {
            cal.add(Calendar.DAY_OF_MONTH, -1);
        }
        System.out.println("要计算日期为:"+sdf.format(cal.getTime())); //输出要计算日期
        cal.setFirstDayOfWeek(Calendar.MONDAY);//设置一个星期的第一天，按中国的习惯一个星期的第一天是星期一
        int day = cal.get(Calendar.DAY_OF_WEEK);//获得当前日期是一个星期的第几天
        System.out.println("获得当前日期是一个星期的第几天："+day);
        cal.add(Calendar.DATE, cal.getFirstDayOfWeek()-day);//根据日历的规则，给当前日期减去星期几与一个星期第一天的差值
        String imptimeBegin = sdf.format(cal.getTime());
        System.out.println("所在周星期一的日期："+imptimeBegin);
        cal.add(Calendar.DATE, 6);
        String imptimeEnd = sdf.format(cal.getTime());
        System.out.println("所在周星期日的日期："+imptimeEnd);

    }


    public static String  getMonthWeekArr(Integer year,Integer month) {
        //该月第一天
        int firstday = DateUtil.toUnixTimeStamp(year.toString() + "-" + month.toString() + "-01", DateUtil.DEFAULT_DATE_PATTERN);
        System.out.println("该月第一天："+DateUtil.toIntDateString(firstday,DateUtil.DEFAULT_DATE_PATTERN));
        //该月的第一周有几天
        Calendar cal = Calendar.getInstance();
        cal.setTime(DateUtil.strToDate(year.toString() + "-" + month.toString() + "-01",DateUtil.DEFAULT_DATE_PATTERN));
        //判断要计算的日期是否是周日，如果是则减一天计算周六的，否则会出问题，计算到下一周去了
        int dayWeek = cal.get(Calendar.DAY_OF_WEEK);
        int firstweekday = (7 - dayWeek +2);
//        int firstweekday = (7 - date('N',firstday) +1);
        //计算该月第一个周一的时间
        int starttime = firstday-3600*24*(7-firstweekday);
        System.out.println("计算该月第一个周一的时间：" + DateUtil.toIntDateString(starttime, DateUtil.DEFAULT_DATE_PATTERN));
        //该月的最后一天
        int lastday = DateUtil.toUnixTimeStamp(year.toString() + "-" + month.toString() + "-" + DateUtil.getLastDayOfMonth(year, month), DateUtil.DEFAULT_DATE_PATTERN);
        System.out.println("该月的最后一天："+DateUtil.toIntDateString(lastday, DateUtil.DEFAULT_DATE_PATTERN));
        //该月的最后一周有几天
//        int lastweekday = date('N',lastday);
        int lastweekday = 0;
        //该月的最后一个周末的时间
        int endtime = lastday-3600*24*lastweekday;
        System.out.println("计算该月第一个周一的时间：" + DateUtil.toIntDateString(endtime, DateUtil.DEFAULT_DATE_PATTERN));
        int step = 3600*24*7;//步长值
        List array = new  ArrayList();
        for (int i=starttime; i<endtime; i= i+step){
            Map map = new HashMap();
            map.put("key",DateUtil.toIntDateString(i,DateUtil.DEFAULT_DATE_PATTERN)+"|"+DateUtil.toIntDateString(i +  3600*24*6,DateUtil.DEFAULT_DATE_PATTERN));
            map.put("val",DateUtil.toIntDateString(i,DateUtil.DEFAULT_DATE_PATTERN)+"~"+DateUtil.toIntDateString(i +  3600*24*6,DateUtil.DEFAULT_DATE_PATTERN));
            array.add(map.toString());
        }
        return JSON.toJSONString(array);
    }




    public static String getCurrentDateTime(){
        SimpleDateFormat sdf = new SimpleDateFormat(DEFAULT_TIME_PATTERN);
        return sdf.format(new Date());
    }

    public static String getReminaShowFlag(String date){
        String flag = "4";
        int a = 259200;
        int b = 604800;
        int c = 864000;
        if(date != null && !date.equals("")){
            SimpleDateFormat sdf=new SimpleDateFormat("yyyy"); //设置时间格式
            Calendar cal = Calendar.getInstance();
            String year = sdf.format(cal.getTime());

            Date birthday = strToDate(date,DEFAULT_DATE_PATTERN);
            SimpleDateFormat sss=new SimpleDateFormat("MM-dd"); //设置时间格式
            year =year+"-"+sss.format(birthday);
            int val = toUnixTimeStampByDate(year)-toUnixTimeStampByDate(toDateString(new Date()));
            if(0<=val && val<= a){
                flag = "1";    //三天内
            }else if(a<val && val<= b){
                flag = "2";    //一周内
            }else if(b<val && val<= c){
                flag = "3";    //十天内
            }
        }
        return  flag;
    }


    public static String getRemindDate(String date){
        String newDate ="";
        if(date!=null&&!date.equals("")){
            if(toUnixTimeStamp(date,DEFAULT_DATE_PATTERN)-toUnixTimeStamp(DateUtil.toDateString(new Date()),DEFAULT_DATE_PATTERN)<0) {
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy"); //设置时间格式
                Calendar cal = Calendar.getInstance();
                String y = sdf.format(cal.getTime());
                Date birthday = strToDate(date, DEFAULT_DATE_PATTERN);
                SimpleDateFormat md = new SimpleDateFormat("MM-dd"); //设置时间格式
                newDate = Integer.parseInt(y) + "-" + md.format(birthday);
                if(toUnixTimeStamp(newDate,DEFAULT_DATE_PATTERN)-toUnixTimeStamp(DateUtil.toDateString(new Date()),DEFAULT_DATE_PATTERN)<0){
                    newDate = (Integer.parseInt(y) + 1) + "-" + md.format(birthday);
                }
            }else{
                newDate =  date;
            }
        }
        return  newDate;
    }

    public static void main(String[] args){
//        System.out.println(toUnixTimeStamp("2016-01-20 10:10:10"));
//        Calendar c = Calendar.getInstance();
//        c.setTime(DateUtil.strToDate(2016 + "-" + 01 + "-01", DateUtil.DEFAULT_DATE_PATTERN));
//        convertWeekByDate(c.getTime());
//        System.out.println(getMonthWeekArr(2016,05));
        String flag = "";
//        int a = 259200;
//        int b = 604800;
//        int c = 864000;
//        SimpleDateFormat sdf=new SimpleDateFormat("yyyy"); //设置时间格式
//        Calendar cal = Calendar.getInstance();
//        String imptimeEnd = sdf.format(cal.getTime());
//        imptimeEnd =imptimeEnd+"-"+"4-20";
//        int val = toUnixTimeStampByDate(imptimeEnd)-toUnixTimeStampByDate(toDateString(new Date()));
//        if(0<=val && val<= a){
//            flag = "1";
//        }else if(a<val && val<= b){
//            flag = "2";
//        }else if(b<val && val<= c){
//            flag = "3";
//        }

        System.out.println(DateUtil.toUnixTimeStampByDate("2018-08-04"));
        Date dateCheck = new Date();
        Calendar calendarCheck = Calendar.getInstance();
        calendarCheck.setTime(dateCheck);
        System.out.println(calendarCheck.get(Calendar.DAY_OF_WEEK));
        System.out.println(calendarCheck.get(Calendar.HOUR_OF_DAY));
    }

    /**
     * 获取SimpleDateFormat
     * @param parttern 日期格式
     * @return SimpleDateFormat对象
     * @throws RuntimeException 异常：非法日期格式
     */
    private static SimpleDateFormat getDateFormat(String parttern) throws RuntimeException {
        return new SimpleDateFormat(parttern);
    }

    /**
     * 获取日期中的某数值。如获取月份
     * @param date 日期
     * @param dateType 日期格式
     * @return 数值
     */
    private static int getInteger(Date date, int dateType) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        return calendar.get(dateType);
    }

    /**
     * 增加日期中某类型的某数值。如增加日期
     * @param date 日期字符串
     * @param dateType 类型
     * @param amount 数值
     * @return 计算后日期字符串
     */
    private static String addInteger(String date, int dateType, int amount) {
        String dateString = null;
        DateStyle dateStyle = getDateStyle(date);
        if (dateStyle != null) {
            Date myDate = StringToDate(date, dateStyle);
            myDate = addInteger(myDate, dateType, amount);
            dateString = DateToString(myDate, dateStyle);
        }
        return dateString;
    }

    /**
     * 增加日期中某类型的某数值。如增加日期
     * @param date 日期
     * @param dateType 类型
     * @param amount 数值
     * @return 计算后日期
     */
    private static Date addInteger(Date date, int dateType, int amount) {
        Date myDate = null;
        if (date != null) {
            Calendar calendar = Calendar.getInstance();
            calendar.setTime(date);
            calendar.add(dateType, amount);
            myDate = calendar.getTime();
        }
        return myDate;
    }

    /**
     * 获取精确的日期
     * @param timestamps 时间long集合
     * @return 日期
     */
    private static Date getAccurateDate(List<Long> timestamps) {
        Date date = null;
        long timestamp = 0;
        Map<Long, long[]> map = new HashMap<Long, long[]>();
        List<Long> absoluteValues = new ArrayList<Long>();

        if (timestamps != null && timestamps.size() > 0) {
            if (timestamps.size() > 1) {
                for (int i = 0; i < timestamps.size(); i++) {
                    for (int j = i + 1; j < timestamps.size(); j++) {
                        long absoluteValue = Math.abs(timestamps.get(i) - timestamps.get(j));
                        absoluteValues.add(absoluteValue);
                        long[] timestampTmp = { timestamps.get(i), timestamps.get(j) };
                        map.put(absoluteValue, timestampTmp);
                    }
                }

                // 有可能有相等的情况。如2012-11和2012-11-01。时间戳是相等的
                long minAbsoluteValue = -1;
                if (!absoluteValues.isEmpty()) {
                    // 如果timestamps的size为2，这是差值只有一个，因此要给默认值
                    minAbsoluteValue = absoluteValues.get(0);
                }
                for (int i = 0; i < absoluteValues.size(); i++) {
                    for (int j = i + 1; j < absoluteValues.size(); j++) {
                        if (absoluteValues.get(i) > absoluteValues.get(j)) {
                            minAbsoluteValue = absoluteValues.get(j);
                        } else {
                            minAbsoluteValue = absoluteValues.get(i);
                        }
                    }
                }

                if (minAbsoluteValue != -1) {
                    long[] timestampsLastTmp = map.get(minAbsoluteValue);
                    if (absoluteValues.size() > 1) {
                        timestamp = Math.max(timestampsLastTmp[0], timestampsLastTmp[1]);
                    } else if (absoluteValues.size() == 1) {
                        // 当timestamps的size为2，需要与当前时间作为参照
                        long dateOne = timestampsLastTmp[0];
                        long dateTwo = timestampsLastTmp[1];
                        if ((Math.abs(dateOne - dateTwo)) < 100000000000L) {
                            timestamp = Math.max(timestampsLastTmp[0], timestampsLastTmp[1]);
                        } else {
                            long now = new Date().getTime();
                            if (Math.abs(dateOne - now) <= Math.abs(dateTwo - now)) {
                                timestamp = dateOne;
                            } else {
                                timestamp = dateTwo;
                            }
                        }
                    }
                }
            } else {
                timestamp = timestamps.get(0);
            }
        }

        if (timestamp != 0) {
            date = new Date(timestamp);
        }
        return date;
    }

    /**
     * 判断字符串是否为日期字符串
     * @param date 日期字符串
     * @return true or false
     */
    public static boolean isDate(String date) {
        boolean isDate = false;
        if (date != null) {
            if (StringToDate(date) != null) {
                isDate = true;
            }
        }
        return isDate;
    }

    /**
     * 获取日期字符串的日期风格。失敗返回null。
     * @param date 日期字符串
     * @return 日期风格
     */
    public static DateStyle getDateStyle(String date) {
        DateStyle dateStyle = null;
        Map<Long, DateStyle> map = new HashMap<Long, DateStyle>();
        List<Long> timestamps = new ArrayList<Long>();
        for (DateStyle style : DateStyle.values()) {
            Date dateTmp = StringToDate(date, style.getValue());
            if (dateTmp != null) {
                timestamps.add(dateTmp.getTime());
                map.put(dateTmp.getTime(), style);
            }
        }
        dateStyle = map.get(getAccurateDate(timestamps).getTime());
        return dateStyle;
    }

    /**
     * 将日期字符串转化为日期。失败返回null。
     * @param date 日期字符串
     * @return 日期
     */
    public static Date StringToDate(String date) {
        DateStyle dateStyle = null;
        return StringToDate(date, dateStyle);
    }

    /**
     * 将日期字符串转化为日期。失败返回null。
     * @param date 日期字符串
     * @param parttern 日期格式
     * @return 日期
     */
    public static Date StringToDate(String date, String parttern) {
        Date myDate = null;
        if (date != null) {
            try {
                myDate = getDateFormat(parttern).parse(date);
            } catch (Exception e) {
            }
        }
        return myDate;
    }

    /**
     * 将日期字符串转化为日期。失败返回null。
     * @param date 日期字符串
     * @param dateStyle 日期风格
     * @return 日期
     */
    public static Date StringToDate(String date, DateStyle dateStyle) {
        Date myDate = null;
        if (dateStyle == null) {
            List<Long> timestamps = new ArrayList<Long>();
            for (DateStyle style : DateStyle.values()) {
                Date dateTmp = StringToDate(date, style.getValue());
                if (dateTmp != null) {
                    timestamps.add(dateTmp.getTime());
                }
            }
            myDate = getAccurateDate(timestamps);
        } else {
            myDate = StringToDate(date, dateStyle.getValue());
        }
        return myDate;
    }

    /**
     * 将日期转化为日期字符串。失败返回null。
     * @param date 日期
     * @param parttern 日期格式
     * @return 日期字符串
     */
    public static String DateToString(Date date, String parttern) {
        String dateString = null;
        if (date != null) {
            try {
                dateString = getDateFormat(parttern).format(date);
            } catch (Exception e) {
            }
        }
        return dateString;
    }

    /**
     * 将日期转化为日期字符串。失败返回null。
     * @param date 日期
     * @param dateStyle 日期风格
     * @return 日期字符串
     */
    public static String DateToString(Date date, DateStyle dateStyle) {
        String dateString = null;
        if (dateStyle != null) {
            dateString = DateToString(date, dateStyle.getValue());
        }
        return dateString;
    }

    /**
     * 将日期字符串转化为另一日期字符串。失败返回null。
     * @param date 旧日期字符串
     * @param parttern 新日期格式
     * @return 新日期字符串
     */
    public static String StringToString(String date, String parttern) {
        return StringToString(date, null, parttern);
    }

    /**
     * 将日期字符串转化为另一日期字符串。失败返回null。
     * @param date 旧日期字符串
     * @param dateStyle 新日期风格
     * @return 新日期字符串
     */
    public static String StringToString(String date, DateStyle dateStyle) {
        return StringToString(date, null, dateStyle);
    }

    /**
     * 将日期字符串转化为另一日期字符串。失败返回null。
     * @param date 旧日期字符串
     * @param olddParttern 旧日期格式
     * @param newParttern 新日期格式
     * @return 新日期字符串
     */
    public static String StringToString(String date, String olddParttern, String newParttern) {
        String dateString = null;
        if (olddParttern == null) {
            DateStyle style = getDateStyle(date);
            if (style != null) {
                Date myDate = StringToDate(date, style.getValue());
                dateString = DateToString(myDate, newParttern);
            }
        } else {
            Date myDate = StringToDate(date, olddParttern);
            dateString = DateToString(myDate, newParttern);
        }
        return dateString;
    }

    /**
     * 将日期字符串转化为另一日期字符串。失败返回null。
     * @param date 旧日期字符串
     * @param olddDteStyle 旧日期风格
     * @param newDateStyle 新日期风格
     * @return 新日期字符串
     */
    public static String StringToString(String date, DateStyle olddDteStyle, DateStyle newDateStyle) {
        String dateString = null;
        if (olddDteStyle == null) {
            DateStyle style = getDateStyle(date);
            dateString = StringToString(date, style.getValue(), newDateStyle.getValue());
        } else {
            dateString = StringToString(date, olddDteStyle.getValue(), newDateStyle.getValue());
        }
        return dateString;
    }

    /**
     * 增加日期的年份。失败返回null。
     * @param date 日期
     * @param yearAmount 增加数量。可为负数
     * @return 增加年份后的日期字符串
     */
    public static String addYear(String date, int yearAmount) {
        return addInteger(date, Calendar.YEAR, yearAmount);
    }

    /**
     * 增加日期的年份。失败返回null。
     * @param date 日期
     * @param yearAmount 增加数量。可为负数
     * @return 增加年份后的日期
     */
    public static Date addYear(Date date, int yearAmount) {
        return addInteger(date, Calendar.YEAR, yearAmount);
    }

    /**
     * 增加日期的月份。失败返回null。
     * @param date 日期
     * @param yearAmount 增加数量。可为负数
     * @return 增加月份后的日期字符串
     */
    public static String addMonth(String date, int yearAmount) {
        return addInteger(date, Calendar.MONTH, yearAmount);
    }

    /**
     * 增加日期的月份。失败返回null。
     * @param date 日期
     * @param yearAmount 增加数量。可为负数
     * @return 增加月份后的日期
     */
    public static Date addMonth(Date date, int yearAmount) {
        return addInteger(date, Calendar.MONTH, yearAmount);
    }

    /**
     * 增加日期的天数。失败返回null。
     * @param date 日期字符串
     * @param dayAmount 增加数量。可为负数
     * @return 增加天数后的日期字符串
     */
    public static String addDay(String date, int dayAmount) {
        return addInteger(date, Calendar.DATE, dayAmount);
    }

    /**
     * 增加日期的天数。失败返回null。
     * @param date 日期
     * @param dayAmount 增加数量。可为负数
     * @return 增加天数后的日期
     */
    public static Date addDay(Date date, int dayAmount) {
        return addInteger(date, Calendar.DATE, dayAmount);
    }

    /**
     * 增加日期的小时。失败返回null。
     * @param date 日期字符串
     * @return 增加小时后的日期字符串
     */
    public static String addHour(String date, int hourAmount) {
        return addInteger(date, Calendar.HOUR_OF_DAY, hourAmount);
    }

    /**
     * 增加日期的小时。失败返回null。
     * @param date 日期
     * @return 增加小时后的日期
     */
    public static Date addHour(Date date, int hourAmount) {
        return addInteger(date, Calendar.HOUR_OF_DAY, hourAmount);
    }

    /**
     * 增加日期的分钟。失败返回null。
     * @param date 日期字符串
     * @return 增加分钟后的日期字符串
     */
    public static String addMinute(String date, int hourAmount) {
        return addInteger(date, Calendar.MINUTE, hourAmount);
    }

    /**
     * 增加日期的分钟。失败返回null。
     * @param date 日期
     * @return 增加分钟后的日期
     */
    public static Date addMinute(Date date, int hourAmount) {
        return addInteger(date, Calendar.MINUTE, hourAmount);
    }

    /**
     * 增加日期的秒钟。失败返回null。
     * @param date 日期字符串
     * @return 增加秒钟后的日期字符串
     */
    public static String addSecond(String date, int hourAmount) {
        return addInteger(date, Calendar.SECOND, hourAmount);
    }

    /**
     * 增加日期的秒钟。失败返回null。
     * @param date 日期
     * @return 增加秒钟后的日期
     */
    public static Date addSecond(Date date, int hourAmount) {
        return addInteger(date, Calendar.SECOND, hourAmount);
    }

    /**
     * 获取日期的年份。失败返回0。
     * @param date 日期字符串
     * @return 年份
     */
    public static int getYear(String date) {
        return getYear(StringToDate(date));
    }

    /**
     * 获取日期的年份。失败返回0。
     * @param date 日期
     * @return 年份
     */
    public static int getYear(Date date) {
        return getInteger(date, Calendar.YEAR);
    }

    /**
     * 获取日期的月份。失败返回0。
     * @param date 日期字符串
     * @return 月份
     */
    public static int getMonth(String date) {
        return getMonth(StringToDate(date));
    }

    /**
     * 获取日期的月份。失败返回0。
     * @param date 日期
     * @return 月份
     */
    public static int getMonth(Date date) {
        return getInteger(date, Calendar.MONTH);
    }

    /**
     * 获取日期的天数。失败返回0。
     * @param date 日期字符串
     * @return 天
     */
    public static int getDay(String date) {
        return getDay(StringToDate(date));
    }

    /**
     * 获取日期的天数。失败返回0。
     * @param date 日期
     * @return 天
     */
    public static int getDay(Date date) {
        return getInteger(date, Calendar.DATE);
    }

    /**
     * 获取日期的小时。失败返回0。
     * @param date 日期字符串
     * @return 小时
     */
    public static int getHour(String date) {
        return getHour(StringToDate(date));
    }

    /**
     * 获取日期的小时。失败返回0。
     * @param date 日期
     * @return 小时
     */
    public static int getHour(Date date) {
        return getInteger(date, Calendar.HOUR_OF_DAY);
    }

    /**
     * 获取日期的分钟。失败返回0。
     * @param date 日期字符串
     * @return 分钟
     */
    public static int getMinute(String date) {
        return getMinute(StringToDate(date));
    }

    /**
     * 获取日期的分钟。失败返回0。
     * @param date 日期
     * @return 分钟
     */
    public static int getMinute(Date date) {
        return getInteger(date, Calendar.MINUTE);
    }

    /**
     * 获取日期的秒钟。失败返回0。
     * @param date 日期字符串
     * @return 秒钟
     */
    public static int getSecond(String date) {
        return getSecond(StringToDate(date));
    }

    /**
     * 获取日期的秒钟。失败返回0。
     * @param date 日期
     * @return 秒钟
     */
    public static int getSecond(Date date) {
        return getInteger(date, Calendar.SECOND);
    }

    /**
     * 获取日期 。默认yyyy-MM-dd格式。失败返回null。
     * @param date 日期字符串
     * @return 日期
     */
    public static String getDate(String date) {
        return StringToString(date, DateStyle.YYYY_MM_DD);
    }

    /**
     * 获取日期。默认yyyy-MM-dd格式。失败返回null。
     * @param date 日期
     * @return 日期
     */
    public static String getDate(Date date) {
        return DateToString(date, DateStyle.YYYY_MM_DD);
    }

    /**
     * 获取日期的时间。默认HH:mm:ss格式。失败返回null。
     * @param date 日期字符串
     * @return 时间
     */
    public static String getTime(String date) {
        return StringToString(date, DateStyle.HH_MM_SS);
    }

    /**
     * 获取日期的时间。默认HH:mm:ss格式。失败返回null。
     * @param date 日期
     * @return 时间
     */
    public static String getTime(Date date) {
        return DateToString(date, DateStyle.HH_MM_SS);
    }

    /**
     * 获取日期的星期。失败返回null。
     * @param date 日期字符串
     * @return 星期
     */
    public static Week getWeek(String date) {
        Week week = null;
        DateStyle dateStyle = getDateStyle(date);
        if (dateStyle != null) {
            Date myDate = StringToDate(date, dateStyle);
            week = getWeek(myDate);
        }
        return week;
    }

    /**
     * 获取日期的星期。失败返回null。
     * @param date 日期
     * @return 星期
     */
    public static Week getWeek(Date date) {
        Week week = null;
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        int weekNumber = calendar.get(Calendar.DAY_OF_WEEK) - 1;
        switch (weekNumber) {
            case 0:
                week = Week.SUNDAY;
                break;
            case 1:
                week = Week.MONDAY;
                break;
            case 2:
                week = Week.TUESDAY;
                break;
            case 3:
                week = Week.WEDNESDAY;
                break;
            case 4:
                week = Week.THURSDAY;
                break;
            case 5:
                week = Week.FRIDAY;
                break;
            case 6:
                week = Week.SATURDAY;
                break;
        }
        return week;
    }

    /**
     * 获取两个日期相差的天数
     * @param date 日期字符串
     * @param otherDate 另一个日期字符串
     * @return 相差天数
     */
    public static int getIntervalDays(String date, String otherDate) {
        return getIntervalDays(StringToDate(date), StringToDate(otherDate));
    }

    /**
     * @param date 日期
     * @param otherDate 另一个日期
     * @return 相差天数
     */
    public static int getIntervalDays(Date date, Date otherDate) {
        date = DateUtil.StringToDate(DateUtil.getDate(date));
        long time = Math.abs(date.getTime() - otherDate.getTime());
        return (int)time/(24 * 60 * 60 * 1000);
    }


}
